#include "App_KeyPad.h"
#include "Bsp.h"

#define HW_Key_Pin              P10     // HW_Key_Define
#define Key_Valid_Level         0       // 按键有效电平
#define Key_Long_Timer          150     // 长按超时时间 10ms * 150 = 1500ms
#define Key_Short_Timer         100     // 短按超时时间 10ms * 100 = 1000ms
#define Key_Short_Gap           15      // 短按松手间隔 10ms * 15  = 150ms

enum KeyPad_Sta {
    KeyPad_Ready_Sta,
    KeyPad_Press_Sta,
    KeyPad_Release_Sta,
} KeySta;

static uint8_t KeyPad_Short_Count = 0;  // 短按次数

static void KeyPad_Scan(void);

fsm_sta_t KeyPad_App(FSM_TaskID id)
{
    fsm_sta_t *Status = FSM_GetSta(id);

    if (*Status & KeyPad_Init_Evt)
    {
        KeySta = KeyPad_Ready_Sta;
        KeyPad_Short_Count = 0;  // 短按次数
        FSM_Evt_Set(id, KeyPad_Time_Evt);

        return *Status ^= KeyPad_Init_Evt;
    }
    
    if (*Status & KeyPad_Time_Evt)
    {
        KeyPad_Scan();
        FSM_Task_Start(id, KeyPad_Time_Evt, 10);
        
        return *Status ^= KeyPad_Time_Evt;
    }
    
    return 0;
}

void KeyPad_Scan(void)
{
    static uint8_t KeyPad_Short_Gap = 0, KeyPad_Count = 0;

    switch (KeySta)
    {
    case KeyPad_Ready_Sta: {
        if (HW_Key_Pin == Key_Valid_Level)
        {
            KeySta = KeyPad_Press_Sta;
        }
        else if (KeyPad_Short_Gap < Key_Short_Gap)
        {
            KeyPad_Short_Gap ++;
        }
        else
        {
            // 短按功能 回调函数于此
            switch (KeyPad_Short_Count)
            {
            case 1: // 短按1次
                // P11 = 1;
                break;

            case 2: // 短按2次
                // P11 = 0;
                break;

            default:
                break;
            }

            KeyPad_Short_Count = 0;
            KeyPad_Short_Gap = 0;
        }
        break;
    }

    case KeyPad_Press_Sta:
        if (HW_Key_Pin == Key_Valid_Level)
        {
            KeySta = KeyPad_Release_Sta;

            KeyPad_Count = 0;
        }
        else
        {
            KeySta = KeyPad_Ready_Sta;
        }
        break;

    case KeyPad_Release_Sta:
        if (HW_Key_Pin == Key_Valid_Level)
        {
            if (KeyPad_Count < Key_Long_Timer)
            {
                KeyPad_Count ++;
            }
            else if (KeyPad_Count == Key_Long_Timer)
            {
                KeyPad_Count ++;
                KeyPad_Short_Count = 0; // 短按次数清空

                // 长按功能 回调函数于此
                // P12 = !P12;
            }
            else
            {
                // 长按连续 回调函数于此
                // P13 = !P13;
            }
        }
        else
        {
            // 短按次数
            if (KeyPad_Count < Key_Short_Timer)
            {
                KeyPad_Short_Count ++;
            }

            KeyPad_Short_Gap = 0;
            KeySta = KeyPad_Ready_Sta;
        }
        break;

    default:
        KeySta = KeyPad_Ready_Sta;
        break;
    }
}